// Package scanner Nginx 配置扫描
package scanner

import (
	"crypto/x509"
	"encoding/pem"
	"fmt"
	"os"
	"time"
)

// SiteInfo 扫描到的站点信息
type SiteInfo struct {
	Name          string    // 站点名称
	Domains       []string  // 域名列表
	ConfigFile    string    // 配置文件路径
	CertPath      string    // 证书文件路径
	KeyPath       string    // 私钥文件路径
	CurrentExpiry time.Time // 当前证书到期时间
	CertSerial    string    // 证书序列号
	CertSubject   string    // 证书主题
}

// Scanner 扫描器接口
type Scanner interface {
	// Scan 扫描配置文件,返回站点列表
	Scan() ([]*SiteInfo, error)
}

// parseCertificate 解析证书文件获取信息
func parseCertificate(certPath string) (expiry time.Time, serial string, subject string, err error) {
	data, err := os.ReadFile(certPath)
	if err != nil {
		return time.Time{}, "", "", fmt.Errorf("failed to read certificate: %w", err)
	}

	// 解析 PEM
	block, _ := pem.Decode(data)
	if block == nil {
		return time.Time{}, "", "", fmt.Errorf("failed to decode PEM")
	}

	// 解析证书
	cert, err := x509.ParseCertificate(block.Bytes)
	if err != nil {
		return time.Time{}, "", "", fmt.Errorf("failed to parse certificate: %w", err)
	}

	return cert.NotAfter, fmt.Sprintf("%X", cert.SerialNumber), cert.Subject.CommonName, nil
}
